// 例子46

{
    class A {
        construvtor() {
            this.x = 'x';
        }
        p() {
            return 2;
        }
    }
    A.prototype.y = 'y'

    class B extends A {
        constructor() {
            super();
            console.log(super.p()); // 2, 这里super指向A.prototype
        }

        get x() {
            return super.x;
        }

        get y() {
            return super.y;
        }
    }

    let b = new B();
    console.log(b.x); // undefined
    console.log(b.y); // "y"
}

console.log('----------------------------------');

{
    class A {
        constructor() {
            this.x = 1;
        }
        print() {
            console.log(this.x);
        }
    }

    class B extends A {
        constructor() {
            super();
            this.x = 2;
        }
        m() {
            super.print(); // 这里print方法执行时，print方法内部的this指向了子类B的实例
        }
    }

    let b = new B();
    b.m() // 2
}

console.log('----------------------------------');

{
    class Parent {
        static myMethod(msg) {
            console.log('static', msg);
        }

        myMethod(msg) {
            console.log('instance', msg);
        }
    }

    class Child extends Parent {
        static myMethod(msg) {
            super.myMethod(msg);
        }

        myMethod(msg) {
            super.myMethod(msg);
        }
    }

    Child.myMethod(1); // static 1

    var child = new Child();
    child.myMethod(2); // instance 2
}

console.log('----------------------------------');

{
    class A {
        constructor() {
            this.x = 1;
        }
        static print() {
            console.log(this.x);
        }
    }

    class B extends A {
        constructor() {
            super();
            this.x = 2;
        }
        static m() {
            super.print();
        }
    }

    B.x = 3;
    B.m() // 3
}